HAL CCB compute ECDSA signature using RNG with software key

Sequence diagram

HAL1

HAL2

@startuml
==Initialization==

participant "User application" as App
participant "HAL CCB Driver" as CCB
App -> CCB : HAL_CCB_Init()
activate CCB
note right : Initialize the CCB handle and associate an instance
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Wrapping key ==
App -> CCB : HAL_CCB_ECDSA_WrapSymmetricKey()
activate CCB
note right : Wrap the clear-text symmetric key
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob creation ==
App -> CCB : HAL_CCB_ECDSA_GenerateWrapPrivateKey()
activate CCB
note right : Generate an RNG private key and create the ECDSA blob using the wrapped key
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob usage ==
App -> CCB : HAL_CCB_ECDSA_Sign()
activate CCB
note right : Compute the signature parts r and s
CCB --> App : HAL_OK
deactivate CCB
note left : return

App -> CCB : HAL_CCB_ECDSA_ComputePublicKey()
activate CCB
note right : Compute public key coordinates x and y
CCB --> App : HAL_OK
deactivate CCB
note left : return

@enduml

@startuml
==Initialization==

participant "User application" as App
participant "HAL CCB Driver" as  CCB

App -> CCB  : HAL_CCB_Init()
activate CCB
note right : Initialize the CCB handle and associate an instance
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Wrapping key ==
App -> CCB  : HAL_CCB_ECDSA_WrapSymmetricKey()
activate CCB
note right : Wrap the clear text from the user with an AES-algorithm
CCB --> App : HAL_OK
deactivate CCB
note left : return

== Blob creation ==

App -> CCB  : HAL_CCB_ECDSA_SW_GenerateWrapPrivateKey()
note right : Create the ECDSCA key blob using RNG
CCB --> App : HAL_OK
note left : return

== Blob usage ==
App -> CCB  : HAL_CCB_ECDSA_SW_Sign()
activate CCB
note right :Compute the signature (part r, part s)
CCB --> App : HAL_OK
deactivate CCB
note left : return
App -> CCB  : HAL_CCB_ECDSA_SW_ComputePublicKey()
activate CCB
note right :Compute public key (coordinate x, coordinate y)
CCB --> App : HAL_OK
note left : return
deactivate CCB

@enduml

Code snippet

HAL1

HAL2

CCB_HandleTypeDef hccb;
CCB_WrappingKeyTypeDef wrappedKeyConf;
CCB_ECDSACurveParamTypeDef ECDSAparam;
CCB_ECDSAKeyBlobTypeDef ECDSAKeyBlob;
CCB_ECDSASignTypeDef Signature;
CCB_ECCMulPointTypeDef publickeyOut;
HAL_CCB_Init(&hccb);

wrappedKeyConf.WrappingKeyType         = HAL_CCB_USER_KEY_WRAPPED;
wrappedKeyConf.pInitVect               = AESIV;
wrappedKeyConf.AES_Algorithm           = CCB_AES_CBC;
wrappedKeyConf.pUserWrappedWrappingKey = Wrapped_key_Buffer;
HAL_CCB_ECDSA_WrapSymmetricKey(&hccb, Symetric_AESKey256, &wrappedKeyConf);

ECDSAKeyBlob.pIV                       = IV_Buffer;
ECDSAKeyBlob.pTag                      = TAG_Buffer;
ECDSAKeyBlob.pWrappedKey               = PrivateKey_encrypted_192;
ECDSAparam.primeOrderSizeByte          = ecdsa192_n_length;
ECDSAparam.modulusSizeByte             = ecdsa192_p_length;
ECDSAparam.coefSignA                   = ecdsa192_a_sign;
ECDSAparam.pAbsCoefA                   = ecdsa192_a_abs;
ECDSAparam.pCoefB                      = ecdsa192_b;
ECDSAparam.pModulus                    = ecdsa192_p;
ECDSAparam.pPrimeOrder                 = ecdsa192_n;
ECDSAparam.pPointX                     = ecdsa192_Gx;
ECDSAparam.pPointY                     = ecdsa192_Gy;



HAL_CCB_ECDSA_GenerateWrapPrivateKey(&hccb, &ECDSAparam,
                                     &wrappedKeyConf,
                                      &ECDSAKeyBlob);

Signature.pSSign                       = ECDSASout_192;
Signature.pRSign                       = ECDSARout_192;

HAL_CCB_ECDSA_Sign(&hccb, &ECDSAparam, &wrappedKeyConf,
                   &ECDSAKeyBlob, ECDSAHash_192, &Signature);


publickeyOut.pPointX                   = PublicKeyXout_192;
publickeyOut.pPointY                   = PublicKeyYout_192;
HAL_CCB_ECDSA_ComputePublicKey(&hccb, &ECDSAparam, &wrappedKeyConf,
                               &ECDSAKeyBlob,
                               &publickeyOut);
hal_ccb_handle_t hccb;
hal_ccb_wrapping_sw_key_context_t wrappedKeyConf;
hal_ccb_ecdsa_curve_param_t ECDSAparam;
hal_ccb_ecdsa_key_blob_t ECDSAKeyBlob;
hal_ccb_ecdsa_sign_t Signature;
hal_ccb_ecc_point_t publickeyOut;
HAL_CCB_Init(&hccb, HAL_CCB);


wrappedKeyConf.p_init_vect                   = AESIV;
wrappedKeyConf.aes_algorithm                 = CCB_AES_CBC;
wrappedKeyConf.key_size                      = 256;
HAL_CCB_ECDSA_WrapSymmetricKey(&hccb, Symetric_AESKey256, &wrappedKeyConf, Wrapped_key_Buffer);

ECDSAKeyBlob.p_iv                            = IV_Buffer;
ECDSAKeyBlob.p_tag                           = TAG_Buffer;
ECDSAKeyBlob.p_wrapped_key                   = PrivateKey_encrypted_192;
ECDSAparam.prime_order_size_byte             = ecdsa192_n_length;
ECDSAparam.modulus_size_byte                 = ecdsa192_p_length;
ECDSAparam.coef_sign_a                       = ecdsa192_a_sign;
ECDSAparam.p_abs_coef_a                      = ecdsa192_a_abs;
ECDSAparam.p_coef_b                          = ecdsa192_b;
ECDSAparam.p_modulus                         = ecdsa192_p;
ECDSAparam.p_prime_order                     = ecdsa192_n;
ECDSAparam.p_point_x                         = ecdsa192_Gx;
ECDSAparam.p_point_y                         = ecdsa192_Gy;
ECDSAparam.ecdsa_pool_buffer.p_buff          = ccb_pool_buffer;
ECDSAparam.ecdsa_pool_buffer.buff_size_byte  = HAL_CCB_ECDSA_CALC_BUFFER_SIZE(ecdsa192_p_length);

HAL_CCB_ECDSA_SW_GenerateWrapPrivateKey(&hccb, &ECDSAparam,
                                        &wrappedKeyConf, Wrapped_key_Buffer,
                                        &ECDSAKeyBlob);

Signature.p_s_sign                           = ECDSASout_192;
Signature.p_r_sign                           = ECDSARout_192;

HAL_CCB_ECDSA_SW_Sign(&hccb, &ECDSAparam, &wrappedKeyConf,
                      Wrapped_key_Buffer, &ECDSAKeyBlob,
                      ECDSAHash_192, 24, &Signature);

publickeyOut.p_point_x                       = PublicKeyXout_192;
publickeyOut.p_point_y                       = PublicKeyYout_192;
HAL_CCB_ECDSA_SW_ComputePublicKey(&hccb, &ECDSAparam, &wrappedKeyConf,
                                  Wrapped_key_Buffer, &ECDSAKeyBlob,
                                  &publickeyOut);